{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tensorflow实现Mnist手写数字识别"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "代码不作为评判标准，如果运⾏正确，则认为代码没有错误。<br/>\n",
    "没有明显报错的正常的log输出-60分<br/>\n",
    "对模型结构的理解-10分<br/>\n",
    "对模型训练过程（梯度如何计算，参数如何更新）的理解-10分<br/>\n",
    "对计算图的理解-10分<br/>\n",
    "解释这⾥的模型为什么效果⽐较差-10分"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.运行程序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "import warnings \n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "# 将TensorFlow日志信息输出到屏幕\n",
    "# TensorFlow有五个不同级别的日志信息，分别为调试DEBUG<信息INFO<警告WARN<错误ERROR<致命FATAL\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "导入Mnist数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-fd1fe8fee27f>:2: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/train-images-idx3-ubyte.gz\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/train-labels-idx1-ubyte.gz\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/t10k-images-idx3-ubyte.gz\n",
      "Extracting /home/silence/DeepLearning_Dataset/MNIST_datasets/t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "Train_data_images_shape: (55000, 784)\n",
      "Train_data_labels_shape: (55000,)\n",
      "Validation_data_images_shape: (5000, 784)\n",
      "Validation_data_labels_shape: (5000,)\n",
      "Test_data_images_shape: (10000, 784)\n",
      "Test_data_labels_shape: (10000,)\n"
     ]
    }
   ],
   "source": [
    "filename = '/home/silence/DeepLearning_Dataset/MNIST_datasets'\n",
    "mnist = input_data.read_data_sets(filename)\n",
    "\n",
    "print('Train_data_images_shape:',mnist.train.images.shape)\n",
    "print('Train_data_labels_shape:',mnist.train.labels.shape)\n",
    "\n",
    "print('Validation_data_images_shape:',mnist.validation.images.shape)\n",
    "print('Validation_data_labels_shape:',mnist.validation.labels.shape)\n",
    "\n",
    "print('Test_data_images_shape:',mnist.test.images.shape)\n",
    "print('Test_data_labels_shape:',mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<font face=\"黑体\"> 显示训练集的一些图片 </font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义网络"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于image和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")\n",
    "\n",
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "# 输入层784个神经元，第一隐层100个神经元\n",
    "L1_units_count = 100\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "# 输出层10个神经元（对应0-9十个数字）\n",
    "L2_units_count = 10\n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2 \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用交叉熵损失\n",
    "cross_entropy_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "# 使用随机梯度下降优化方式\n",
    "optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，要想看到概率分布，还需要做一下softmax。<br/>\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算准确率\n",
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 3000\n",
    "# saver用来保存或恢复训练的模型\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.856436, the validation accuracy is 0.8848\n",
      "after 200 training steps, the loss is 0.537296, the validation accuracy is 0.8826\n",
      "after 300 training steps, the loss is 0.188853, the validation accuracy is 0.8766\n",
      "after 400 training steps, the loss is 0.22887, the validation accuracy is 0.9286\n",
      "after 500 training steps, the loss is 0.173041, the validation accuracy is 0.9338\n",
      "after 600 training steps, the loss is 0.322998, the validation accuracy is 0.9376\n",
      "WARNING:tensorflow:From /home/silence/miniconda3/lib/python3.7/site-packages/tensorflow_core/python/training/saver.py:963: remove_checkpoint (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to delete files with this prefix.\n",
      "after 700 training steps, the loss is 0.279035, the validation accuracy is 0.9436\n",
      "after 800 training steps, the loss is 0.158228, the validation accuracy is 0.9472\n",
      "after 900 training steps, the loss is 0.216854, the validation accuracy is 0.9484\n",
      "after 1000 training steps, the loss is 0.0161331, the validation accuracy is 0.9578\n",
      "after 1100 training steps, the loss is 0.176697, the validation accuracy is 0.956\n",
      "after 1200 training steps, the loss is 0.256477, the validation accuracy is 0.9582\n",
      "after 1300 training steps, the loss is 0.0327178, the validation accuracy is 0.9604\n",
      "after 1400 training steps, the loss is 0.222197, the validation accuracy is 0.9556\n",
      "after 1500 training steps, the loss is 0.0610511, the validation accuracy is 0.9568\n",
      "after 1600 training steps, the loss is 0.215626, the validation accuracy is 0.9606\n",
      "after 1700 training steps, the loss is 0.108489, the validation accuracy is 0.9646\n",
      "after 1800 training steps, the loss is 0.0336074, the validation accuracy is 0.966\n",
      "after 1900 training steps, the loss is 0.010997, the validation accuracy is 0.9624\n",
      "after 2000 training steps, the loss is 0.0420148, the validation accuracy is 0.9636\n",
      "after 2100 training steps, the loss is 0.185701, the validation accuracy is 0.9682\n",
      "after 2200 training steps, the loss is 0.107192, the validation accuracy is 0.9592\n",
      "after 2300 training steps, the loss is 0.0266246, the validation accuracy is 0.9662\n",
      "after 2400 training steps, the loss is 0.0214103, the validation accuracy is 0.9674\n",
      "after 2500 training steps, the loss is 0.130103, the validation accuracy is 0.9648\n",
      "after 2600 training steps, the loss is 0.401562, the validation accuracy is 0.9702\n",
      "after 2700 training steps, the loss is 0.0728729, the validation accuracy is 0.9662\n",
      "after 2800 training steps, the loss is 0.0253276, the validation accuracy is 0.9684\n",
      "after 2900 training steps, the loss is 0.0865479, the validation accuracy is 0.9608\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9603\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用训练过的模型进行测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-2900\n",
      "0.875\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.作业回答"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.没有明显报错的正常的log输出<br/>\n",
    "&ensp;从以上输出结果可以看出，输出的log没有明显报错"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.对模型结构的理解<br/>\n",
    "&ensp;此模型使用的是单隐层的全连接网络。<br/>\n",
    "&ensp;每张图片像素为28*28=784，则对应每个输入数据x有784个输入单元<br/>\n",
    "&ensp;对每张图片的预测为0-9这十个数字，因此输出单元为10个<br/>\n",
    "&ensp;此模型设计时使用单隐层100个神经元<br/>\n",
    "&ensp;使用的是交叉熵损失和随机梯度下降优化<br/>\n",
    "&ensp;训练时以32组数据为一个batch，整个训练集训练3000次<br/>\n",
    "&ensp;训练的结果经过softmax函数形成对图片进行预测的概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3.对模型训练过程（梯度如何计算，参数如何更新）的理解<br/>\n",
    "&ensp;a）梯度的计算：网络训练的过程就是对每一个权重进行调节的过程，从网络的输出层的代价函数开始，<br/>\n",
    "&emsp;&emsp;反向向输入层逐层计算梯度（对权重求偏倒），从而实现误差的传递。<br/>\n",
    "&ensp;b）参数的更新：梯度计算完毕后，完成了权重更新方向的确定，然后用之前的权重减去学习率乘以该梯度，便完成了参数的更新。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4.对计算图的理解<br/>\n",
    "&ensp;计算图主要由四个部分构成:<br/>\n",
    "&ensp;a）张量（Tensor）用来表示数据，比如本例中的训练集x，它的每一组数据都为一个张量。<br/>\n",
    "&ensp;b）变量（Variable）就是在计算图的过程中可以改变的节点，在本例中，权重w和偏置b都会随着迭代的进行<br/>\n",
    "&emsp;&emsp;而不断变化，这样的值就可以拿来作为变量。在使用变量的时候，我们都会给变量设置一个初始值。<br/>\n",
    "&ensp;c）操作（Option）则是专门运算的操作节点，所有操作都是一个op，比如加法，乘法。<br/>\n",
    "&ensp;d）会话（Session）则是用来运行整个图的。在Tensorflow中，启动一个图的前提是先要创建一个会话（Session）,<br/>\n",
    "&emsp;&emsp;Tensorflow的所有对图的操作，都必须放在会话中进行。在会话中提供了一个run方法，用来执行计算图的整体或局部的操作。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5.解释这⾥的模型为什么效果⽐较差\n",
    "&ensp;神经网络只有一个隐层，神经元数目较少，模型简单，而且训练次数较少。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
